// 我们可以考虑借助 map，在第一次建立顺序链的时候，将原来链上的节点和新复制的节点，建立 map 关系
// 然后再遍历一次原来顺序链，这样就可以找到原顺序链的节点，原顺序链的下一个节点
// 这样通过 map 就可以对应得到复制顺序链的当前的节点和下一个节点，然后建立指向即可

var copyRandomList = function (head) {
  if (!head) return null;
  let cur = head,
    node = new Node(),
    temp = node;
  map = new Map();
  // 第一次遍历，生成一个具有 val next 属性的链表，同时记录
  // 当前节点和 random 属性的关系
  while (cur) {
    temp.val = cur.val;
    temp.next = cur.next !== null ? new Node() : null;
    map.set(cur, temp);
    cur = cur.next;
    temp = temp.next;
  }
  temp = node;
  while (head) {
    temp.random = head.random !== null ? map.get(head.random) : null;
    head = head.next;
    temp = temp.next;
  }
  return node;
};
